gusucode.com > 各种VC自绘控件源码程序 > 各种VC自绘控件源码/code/SkinControls(自绘MFC基本控件 )/SkinControls/SkinControls/SkinEdit.cpp
#include "stdafx.h" #include "SkinEdit.h" ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// IMPLEMENT_DYNAMIC(CSkinEdit, CEdit) BEGIN_MESSAGE_MAP(CSkinEdit, CEdit) ON_WM_CTLCOLOR_REFLECT() ON_WM_KEYDOWN() ON_WM_SETFOCUS() ON_WM_LBUTTONDOWN() ON_WM_MBUTTONDOWN() ON_WM_RBUTTONDOWN() ON_WM_NCPAINT() ON_WM_KILLFOCUS() END_MESSAGE_MAP() ////////////////////////////////////////////////////////////////////////// //构造函数 CSkinEdit::CSkinEdit(): m_bFirstTime(TRUE),m_strPromptText(TEXT("")),m_crPromptColor(RGB(255,153,0)) { m_crFrameColor = RGB(40,138,228); m_brush.CreateSolidBrush(GetSysColor(COLOR_WINDOW)); } //析构函数 CSkinEdit::~CSkinEdit() { m_brush.DeleteObject(); } void CSkinEdit::SetPromptColor(COLORREF crText) { m_crPromptColor = crText; } void CSkinEdit::SetPromptText(LPCTSTR lpszPrompt) { m_strPromptText = lpszPrompt; if (m_strPromptText.IsEmpty()) m_bFirstTime = FALSE; if (m_bFirstTime) SetWindowText(m_strPromptText); } void CSkinEdit::SetFrameColor(COLORREF crFrameColor) { m_crFrameColor = crFrameColor; } void CSkinEdit::OnSetFocus(CWnd* pOldWnd) { CEdit::OnSetFocus(pOldWnd); if (m_bFirstTime) { SetSel(m_strPromptText.GetLength(), m_strPromptText.GetLength()); } } void CSkinEdit::OnKillFocus(CWnd* pNewWnd) { CEdit::OnKillFocus(pNewWnd); SetWindowText(m_strPromptText); m_bFirstTime = TRUE; } HBRUSH CSkinEdit::CtlColor(CDC* pDC, UINT /*nCtlColor*/) { if (m_bFirstTime) pDC->SetTextColor(m_crPromptColor); return m_brush; } void CSkinEdit::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { if (m_bFirstTime) { m_bFirstTime = FALSE; SetWindowText(TEXT("")); } CEdit::OnKeyDown(nChar, nRepCnt, nFlags); } void CSkinEdit::OnLButtonDown(UINT nFlags, CPoint point) { if (m_bFirstTime) { m_bFirstTime = FALSE; SetWindowText(TEXT("")); } CEdit::OnLButtonDown(nFlags, point); } void CSkinEdit::OnMButtonDown(UINT nFlags, CPoint point) { if (m_bFirstTime) { m_bFirstTime = FALSE; SetWindowText(TEXT("")); } CEdit::OnMButtonDown(nFlags, point); } void CSkinEdit::OnRButtonDown(UINT nFlags, CPoint point) { if (m_bFirstTime) { m_bFirstTime = FALSE; SetWindowText(TEXT("")); } CEdit::OnRButtonDown(nFlags, point); } int CSkinEdit::GetWindowText(LPTSTR lpszStringBuf, int nMaxCount) const { if (m_bFirstTime) { if (lpszStringBuf && (nMaxCount > 0)) lpszStringBuf[0] = TEXT('\0'); return 0; } return CEdit::GetWindowText(lpszStringBuf, nMaxCount); } void CSkinEdit::GetWindowText(CString& rString) const { if (m_bFirstTime) rString = TEXT(""); else CEdit::GetWindowText(rString); } void CSkinEdit::SetWindowText(LPCTSTR lpszString) { if (m_bFirstTime && (lpszString[0] == TEXT('\0'))) return; if (lpszString && (m_strPromptText.Compare(lpszString) != 0)) m_bFirstTime = FALSE; CEdit::SetWindowText(lpszString); } LRESULT CSkinEdit::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) { if (message == WM_SETTEXT) { TCHAR *cp = (TCHAR *) lParam; if (!cp) return TRUE; if (m_bFirstTime && (cp[0] == TEXT('\0'))) return TRUE; if (m_strPromptText.Compare(cp) != 0) m_bFirstTime = FALSE; } else if (message == WM_GETTEXT) { if (m_bFirstTime) { TCHAR *cp = (TCHAR *) lParam; if (cp && (wParam != 0)) *cp = TEXT('\0'); return 0; } } return CEdit::DefWindowProc(message, wParam, lParam); } void CSkinEdit::OnNcPaint() { CEdit::OnNcPaint(); CDC *pDC = GetWindowDC(); CRect rectItem, pRect; GetWindowRect(pRect); GetClientRect(rectItem); CPen nDarkBorder, nWhiteBorder; nDarkBorder.CreatePen(PS_SOLID, 1, m_crFrameColor); nWhiteBorder.CreatePen(PS_SOLID, 1, RGB(255, 255, 255)); rectItem.right = rectItem.left + pRect.Width(); rectItem.bottom = rectItem.top + pRect.Height(); CPoint TopLeft(rectItem.left, rectItem.top); CPoint BottomRight(rectItem.right - 1, rectItem.bottom - 1); CPoint TopRight(rectItem.right - 1, rectItem.top); CPoint BottomLeft(rectItem.left, rectItem.bottom - 1); pDC->SelectObject(&nDarkBorder); pDC->MoveTo(TopLeft); pDC->LineTo(TopRight); pDC->MoveTo(TopLeft); pDC->LineTo(BottomLeft); pDC->MoveTo(BottomLeft.x, BottomLeft.y - 1); pDC->LineTo(BottomRight.x, BottomRight.y - 1); pDC->MoveTo(BottomRight.x - 1, BottomRight.y); pDC->LineTo(TopRight.x - 1, TopRight.y); pDC->SelectObject(&nWhiteBorder); pDC->MoveTo(BottomLeft); pDC->LineTo(BottomRight); pDC->MoveTo(BottomRight); pDC->LineTo(TopRight); pDC->MoveTo(TopLeft.x + 1, TopLeft.y + 1); pDC->LineTo(TopRight.x - 1, TopRight.y + 1); pDC->MoveTo(TopLeft.x + 1, TopLeft.y + 1); pDC->LineTo(BottomLeft.x + 1, BottomLeft.y - 1); ReleaseDC(pDC); } //////////////////////////////////////////////////////////////////////////